use codegraph_parser::dpml::*;

fn main() -> anyhow::Result<()> {
    // 创建DPML解析器
    let mut parser = DpmlParser::new()?;
    
    // 示例DPML文档
    let dpml_source = r#"
<prompt>
  <thinking type="analysis">
    # 问题分析
    这是一个**数据处理**问题，需要考虑：
    1. 数据格式转换
    2. 性能优化
    
    参考资源：@file://document.md
    相关术语：#数据处理 #性能优化
  </thinking>
  
  <executing priority="high">
    # 执行步骤
    1. 首先读取输入文件
    2. 应用转换算法
    3. 输出结果到目标位置
    
    确保全程**记录日志**以便调试。
  </executing>
  
  <resource type="reference" src="docs/api-spec.md" />
  
  <!-- 存储操作通过execution协议实现 -->
  <store:execution>
    <content>用户操作系统：MacOS 13.4</content>
    
    <process>
      # 存储流程
      1. 接收内容
      2. 验证格式
      3. 写入存储
    </process>
    
    <rule>
      1. 记忆写入必须原子化
      2. 冲突时保留高置信度版本
    </rule>
  </store:execution>
</prompt>
"#;

    println!("=== DPML解析器示例 ===\n");
    
    // 解析文档
    println!("解析DPML文档...");
    let document = parser.parse(dpml_source)?;
    
    // 获取所有元素
    let elements = document.elements();
    println!("找到 {} 个元素:", elements.len());
    
    for (i, element) in elements.iter().enumerate() {
        println!("  {}. <{}> (自闭合: {})", 
                 i + 1, 
                 element.tag_name(), 
                 element.is_self_closing());
        
        // 显示属性
        if !element.attributes().is_empty() {
            println!("     属性:");
            for (key, value) in element.attributes() {
                println!("       {}=\"{}\"", key, value);
            }
        }
        
        // 显示内容预览（前50个字符）
        if !element.is_self_closing() && !element.content().trim().is_empty() {
            let content_preview = element.content().trim();
            let preview = if content_preview.chars().count() > 50 {
                let truncated: String = content_preview.chars().take(50).collect();
                format!("{}...", truncated)
            } else {
                content_preview.to_string()
            };
            println!("     内容: {}", preview.replace('\n', " "));
        }
    }
    
    // 获取资源引用
    println!("\n=== 资源引用 ===");
    let resource_refs = document.resource_references();
    println!("找到 {} 个资源引用:", resource_refs.len());
    
    for (i, resource_ref) in resource_refs.iter().enumerate() {
        println!("  {}. {}{}://{}", 
                 i + 1,
                 resource_ref.prefix(),
                 resource_ref.protocol(),
                 resource_ref.path());
        
        if !resource_ref.query_params().is_empty() {
            println!("     查询参数:");
            for (key, value) in resource_ref.query_params() {
                println!("       {}={}", key, value);
            }
        }
    }
    
    // 获取术语引用
    println!("\n=== 术语引用 ===");
    let term_refs = document.term_references();
    println!("找到 {} 个术语引用:", term_refs.len());
    
    for (i, term_ref) in term_refs.iter().enumerate() {
        println!("  {}. #{}", i + 1, term_ref.term());
    }
    
    // 查找特定标签
    println!("\n=== 特定标签查询 ===");
    let thinking_elements = document.find_elements_by_tag("thinking");
    println!("找到 {} 个 <thinking> 元素:", thinking_elements.len());
    
    for element in thinking_elements {
        if let Some(type_attr) = element.get_attribute("type") {
            println!("  类型: {}", type_attr);
        }
    }
    
    let namespace_elements = document.find_elements_by_tag("store:execution");
    println!("找到 {} 个 <store:execution> 元素:", namespace_elements.len());
    
    // 演示查询功能
    println!("\n=== 查询功能 ===");
    let query_str = r#"(element (paired_element (start_tag (tag_name) @tag)))"#;
    match parser.query(dpml_source, query_str) {
        Ok(match_count) => {
            println!("查询 '{}' 找到 {} 个匹配", query_str, match_count);
        }
        Err(e) => {
            println!("查询失败: {}", e);
        }
    }
    
    println!("\n=== 解析完成 ===");
    
    Ok(())
}
